home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Franz PD
/
Franz PD Disk #281 (1993)(Rhein-Sieg-Soft).zip
/
Franz PD Disk #281 (1993)(Rhein-Sieg-Soft).adf
/
ListPorts
/
ListPorts.S
< prev
next >
Wrap
Text File
|
1993-07-27
|
5KB
|
124 lines
;**************************** ListPorts *****************************
;* *
;* Listet die Public-Ports mit Namen, Adresse und Priorität auf. *
;* Dies sind die 'öffentlichen' Message-Ports, die in der Liste *
;* 'PortList' miteinander verkettet sind. Außerdem wird noch der *
;* Zeiger auf den Empfänger-Task ausgegeben. *
;* Aufruf vom CLI aus ohne Parameter. *
;* *
;* © 1993 by Michael Gottwald *
;********************************************************************
Open = -30 ; dos.library
Write = -48 ; " "
OutPut = -60 ; " "
Exit = -144 ; " "
OpenLib = -408 ; exec.library
CloseLib = -414 ; " "
;----dos.library öffnen und Standard-Ausgabekanal ermitteln----------
run: movem.l a0-a6/d0-d7,-(sp) ; Alle Register retten
move.l $4,a6
lea DosName,a1
jsr OpenLib(a6)
move.l d0,DosBase
move.l d0,a6
jsr OutPut(a6)
move.l d0,Handle
move.l #Text,d2
move.l #41,d3
bsr print ; Text ausgeben
;----PortList-Liste durchsuchen und Namen ausgeben-------------------
move.l $4,a0 ; Adresse der ExecBase-Struktur
add.l #392,a0 ; ab hier beginnt PortList...
move.l a0,d0
add.l #4,d0
cmp.l (a0),d0 ; ist die Liste leer ?
beq noPorts ; ja, --> Ende
move.l (a0),a0 ; Listenkopf überlesen
loop: move.l (a0),Node ; Zeiger auf Nachfolger retten
beq end ; = 0, --> Ende
move.l a0,Adress ; Adresse der Struktur
move.b 9(a0),Priority ; Priorität holen
move.l 16(a0),SigTask ; Zeiger auf Empfänger-Task
move.l 10(a0),a1 ; Adresse des Namens
lea.l Name,a2 ; Adresse des String-Puffers
move.l #0,d3
copy: move.b (a1)+,(a2)+ ; Zeichen kopieren
addq.l #1,d3 ; Zeichen zählen
tst.b -1(a2) ; war letzter Code = 0 ?
bne copy ; nein, --> weiterkopieren
addq.l #1,d3
move.l #Name,d2 ; Text-Adresse...
bsr print ; Name ausgeben
move.l Node,a0 ; Zeiger auf nächsten Knoten
bra loop ; nächsten Namen holen
noPorts: move.l #Text2,d2 ; Liste ist leer...
move.l #33,d3
bsr print ; Meldung ausgeben
bra end
;----Text ausgeben---------------------------------------------------
print: move.l DosBase,a6
move.l Handle,d1 ; Ausgabekanal (Shell-Fenster)
jsr Write(a6) ; Text ausgeben
rts
;----Zurück ins CLI--------------------------------------------------
end: movem.l (sp)+,a0-a6/d0-d7 ; Register zurückholen
move.l DosBase,a6
clr.l d1 ; kein Return Code
jsr Exit(a6)
;----Dezimalzahl zwischen -128 und 127 ausgeben----------------------
prntDez: lea.l Puffer,a0
btst #7,d0 ; Zahl negativ ?
bne positiv ; nein, --> springen
move.b #"-",(a0)+ ; "-" voranstellen
and.b #127,d0 ; Bit 7 löschen
subi.w #256,d0 ; Absolutwert errechnen
positiv: cmp.b #99,d0
bhi xxx ; größer als 99, --> springen
cmp.b #9,d0
bhi xx ; größer als 9, --> springen
prntVal: add.b #"0",d0 ; ASCII-Code berechnen
move.b d0,(a0) ; Ziffer in Puffer schreiben
move.l #Puffer,d2
move.l #5,d3
bsr print ; Zahl ausgeben
rts
xxx: move.b #"1",(a0)+ ; Hunderter-Ziffer in Puffer
subi.b #100,d0 ; 3. Stelle entfernen
xx:
;----Datenbereich----------------------------------------------------
even
DosName: dc.b "dos.library",0
DosBase: dc.l 0
Handle: dc.l 0
Node: dc.l 0
Priority: dc.l 0
Adress: dc.l 0
SigTask: dc.l 0
Name: blk.b 50,0 ; Puffer für den aktuellen Namen
Text: dc.b "Folgende Message-Ports sind vorhanden:",13,10,10,0
Text2: dc.b "Keine Message-Ports vorhanden !",13,10
PriText: dc.b " , Priorität = ",0
AdrText: dc.b " , Adresse = ",0
TskText: dc.b " , Empfänger-Task = ",0
Puffer: blk.b 10,0 ; Puffer für Dez- und Hex-Zahl